/******************************************************************************
 * NTRU Cryptography Reference Source Code
 *
 * Copyright (C) 2009-2016  Security Innovation (SI)
 *
 * SI has dedicated the work to the public domain by waiving all of its rights
 * to the work worldwide under copyright law, including all related and
 * neighboring rights, to the extent allowed by law.
 *
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * You can copy, modify, distribute and perform the work, even for commercial
 * purposes, all without asking permission. You should have received a copy of
 * the creative commons license (CC0 1.0 universal) along with this program.
 * See the license file for more information. 
 *
 *
 *********************************************************************************/

 /*
  * Contents: Tests for the SHA256 class.
  *
  * This just tests the correctness of the SHA algorithm by comparing
  * its output to known test vectors. The test vectors come from the
  * cryptolib library and are a combination of the FIPS 180-2 test
  * vectors and home-grown test vectors.
  */

package com.securityinnovation.jNeo.digest;

import org.junit.Test;
import static org.junit.Assert.*;

/////////////////////////////////////////////////////////////////////////
// Tests:
//   - getDigestLen
//       - check correct length
//   - getBlockLen
//       - check correct length
//   - reset
//       - use on partial digest
//       - use on finished digest
//       - multiple use
//   - update
//       - null buffer
//       - negative offset
//       - negative length
//       - offset+length overrun buffer end
//       - calling multiple times on split buffers is the same as calling
//         once on full buffer.
//   - finishDigest
//       - null buffer
//       - negative offset
//       - offset+output length overrun buffer end
//       - verify object is left reinitialized for new hash operation
//   - known-value tests. These are positive tests for update and finishDigest.

public class Sha256BBTestCase {

    /////////////////////////////////////////////////////////////////////////
    // Test getDigestLen
    // 
    // Implements test case SGD-1.
    @Test public void test_getDigestLen()
    {
        Sha256 s = new Sha256();
        assertEquals(32, s.getDigestLen());
    }


    /////////////////////////////////////////////////////////////////////////
    // Test getBlockLen
    // 
    // Implements test case SGB-1.
    @Test public void test_getBlockLen()
    {
        Sha256 s = new Sha256();
        assertEquals(64, s.getBlockLen());
    }


    /////////////////////////////////////////////////////////////////////////
    // Test reset
    // 
    // Implements test case SRS-1.
    // reset:  use on partial digest
    @Test public void test_reset_partial_state()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 128);
        s.reset();
        s.update(sha256_in, 0, 56);
        assertArrayEquals(sha256_ans56, s.finishDigest());
    }
    // reset:  use on finished digest
    @Test public void test_reset_finished_digest()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 128);
        s.finishDigest();
        s.reset();
        s.update(sha256_in, 0, 56);
        assertArrayEquals(sha256_ans56, s.finishDigest());
    }
    // reset:  multiple use
    @Test public void test_reset_multiple_use()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 128);
        s.finishDigest();
        s.reset();
        s.reset();
        s.reset();
        s.update(sha256_in, 0, 56);
        assertArrayEquals(sha256_ans56, s.finishDigest());
    }


    /////////////////////////////////////////////////////////////////////////
    // Test update
    // 
    // Implements test case SUP-2.
    @Test(expected=NullPointerException.class)
    public void test_update_null()
    {
        Sha256 s = new Sha256();
        s.update(null, 0, 2);
    }
    
    // Implements test case SUP-5.
    @Test(expected=IllegalArgumentException.class)
    public void test_update_negativeOffset()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, -1, 10);
    }
    
    // Implements test case SUP-4.
    @Test(expected=IllegalArgumentException.class)
    public void test_update_negativeLength()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, -1);
    }
    
    // Implements test case SUP-6.
    @Test(expected=IllegalArgumentException.class)
    public void test_update_overrun()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 1, sha256_in.length);
    }
    
    // Implements test case SUP-3.
    @Test public void test_update_length_zero()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 0);
    }

    // update:  calling multiple times on split buffers is the same as calling
    //          once on full buffer.
    @Test public void test_update_multple_buffers()
    {
        Sha256 s = new Sha256();
        for (int i=0; i<56; i++)
          s.update(sha256_in, i, 1);
        assertArrayEquals(sha256_ans56, s.finishDigest());
    }


    /////////////////////////////////////////////////////////////////////////
    // Test finishDigest
    //
    // Implements test case SFD-2
    public void test_finishDigest_reset()
    {
        Sha256 s = new Sha256();
        byte b[] = new byte[32];

        // Hash some misc data and finish the computation
        java.util.Arrays.fill(b, (byte)0);
        s.update(b, 0, 10);
        s.finishDigest(b, 0);

        // Hash some new data. Verify the output doesn't depend on the previous hash
        s.update(sha256_in, 0, 3);
        s.finishDigest(b, 0);
        assertArrayEquals(sha256_ans3, b);
    }

    // Implements test case SFD-3.
    @Test(expected=NullPointerException.class)
    public void test_finishDigest_null()
    {
        Sha256 s = new Sha256();
        s.finishDigest(null, 0);
    }
    
    // Implements test case SFD-4.
    @Test(expected=IllegalArgumentException.class)
    public void test_finishDigest_negativeOffset()
    {
        Sha256 s = new Sha256();
        byte b[] = new byte[32];
        java.util.Arrays.fill(b, (byte)0);
        s.finishDigest(b, -1);
    }
    
    // Implements test case SFD-5.
    @Test(expected=IllegalArgumentException.class)
    public void test_finishDigest_overrun()
    {
        Sha256 s = new Sha256();
        byte b[] = new byte[32];
        java.util.Arrays.fill(b, (byte)0);
        s.finishDigest(b, 1);
    }


    /////////////////////////////////////////////////////////////////////////
    // Known-value tests. These are positive tests for update and finishDigest.
    // Implements test cases SHC-1, SFD-1, SFD-2, and SUP-1.
    //
    @Test public void test_0_bytes()
    {
        Sha256 s = new Sha256();
        assertArrayEquals(sha256_ans0, s.finishDigest());
    }
    @Test public void test_3_bytes()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 3);
        assertArrayEquals(sha256_ans3, s.finishDigest());
    }
    @Test public void test_56_bytes()
    {
        Sha256 s = new Sha256();
        s.update(sha256_in, 0, 56);
        assertArrayEquals(sha256_ans56, s.finishDigest());
    }

    static final byte sha256_in[] = {
        (byte)0x61, (byte)0x62, (byte)0x63, (byte)0x64,
        (byte)0x62, (byte)0x63, (byte)0x64, (byte)0x65,
        (byte)0x63, (byte)0x64, (byte)0x65, (byte)0x66,
        (byte)0x64, (byte)0x65, (byte)0x66, (byte)0x67,
        (byte)0x65, (byte)0x66, (byte)0x67, (byte)0x68,
        (byte)0x66, (byte)0x67, (byte)0x68, (byte)0x69,
        (byte)0x67, (byte)0x68, (byte)0x69, (byte)0x6a,
        (byte)0x68, (byte)0x69, (byte)0x6a, (byte)0x6b,
        (byte)0x69, (byte)0x6a, (byte)0x6b, (byte)0x6c,
        (byte)0x6a, (byte)0x6b, (byte)0x6c, (byte)0x6d,
        (byte)0x6b, (byte)0x6c, (byte)0x6d, (byte)0x6e,
        (byte)0x6c, (byte)0x6d, (byte)0x6e, (byte)0x6f,
        (byte)0x6d, (byte)0x6e, (byte)0x6f, (byte)0x70,
        (byte)0x6e, (byte)0x6f, (byte)0x70, (byte)0x71,
        (byte)0x6f, (byte)0x70, (byte)0x71, (byte)0x72,
        (byte)0x70, (byte)0x71, (byte)0x72, (byte)0x73,
        (byte)0x71, (byte)0x72, (byte)0x73, (byte)0x74,
        (byte)0x72, (byte)0x73, (byte)0x64, (byte)0x65,
        (byte)0x73, (byte)0x74, (byte)0x75, (byte)0x76,
        (byte)0x74, (byte)0x75, (byte)0x76, (byte)0x77,
        (byte)0x75, (byte)0x76, (byte)0x77, (byte)0x78,
        (byte)0x76, (byte)0x77, (byte)0x78, (byte)0x79,
        (byte)0x77, (byte)0x78, (byte)0x79, (byte)0x7a,
        (byte)0x78, (byte)0x79, (byte)0x7a, (byte)0x7b,
        (byte)0x79, (byte)0x7a, (byte)0x7b, (byte)0x7c,
        (byte)0x7a, (byte)0x7b, (byte)0x7c, (byte)0x7d,
        (byte)0x7b, (byte)0x7c, (byte)0x7d, (byte)0x7e,
        (byte)0x7c, (byte)0x7d, (byte)0x7e, (byte)0x7f,
        (byte)0x7d, (byte)0x7e, (byte)0x7f, (byte)0x80,
        (byte)0x7e, (byte)0x7f, (byte)0x80, (byte)0x81,
        (byte)0x7f, (byte)0x80, (byte)0x81, (byte)0x82,
        (byte)0x80, (byte)0x81, (byte)0x82, (byte)0x83,
    };
    
    static final byte sha256_ans0[] = {
        (byte)0xe3, (byte)0xb0, (byte)0xc4, (byte)0x42,
        (byte)0x98, (byte)0xfc, (byte)0x1c, (byte)0x14,
        (byte)0x9a, (byte)0xfb, (byte)0xf4, (byte)0xc8,
        (byte)0x99, (byte)0x6f, (byte)0xb9, (byte)0x24,
        (byte)0x27, (byte)0xae, (byte)0x41, (byte)0xe4,
        (byte)0x64, (byte)0x9b, (byte)0x93, (byte)0x4c,
        (byte)0xa4, (byte)0x95, (byte)0x99, (byte)0x1b,
        (byte)0x78, (byte)0x52, (byte)0xb8, (byte)0x55,
    };
    
    static final byte sha256_ans3[] = {
        (byte)0xba, (byte)0x78, (byte)0x16, (byte)0xbf,
        (byte)0x8f, (byte)0x01, (byte)0xcf, (byte)0xea,
        (byte)0x41, (byte)0x41, (byte)0x40, (byte)0xde,
        (byte)0x5d, (byte)0xae, (byte)0x22, (byte)0x23,
        (byte)0xb0, (byte)0x03, (byte)0x61, (byte)0xa3,
        (byte)0x96, (byte)0x17, (byte)0x7a, (byte)0x9c,
        (byte)0xb4, (byte)0x10, (byte)0xff, (byte)0x61,
        (byte)0xf2, (byte)0x00, (byte)0x15, (byte)0xad,
    };

    static final byte sha256_ans56[] = {
        (byte)0x24, (byte)0x8d, (byte)0x6a, (byte)0x61,
        (byte)0xd2, (byte)0x06, (byte)0x38, (byte)0xb8,
        (byte)0xe5, (byte)0xc0, (byte)0x26, (byte)0x93,
        (byte)0x0c, (byte)0x3e, (byte)0x60, (byte)0x39,
        (byte)0xa3, (byte)0x3c, (byte)0xe4, (byte)0x59,
        (byte)0x64, (byte)0xff, (byte)0x21, (byte)0x67,
        (byte)0xf6, (byte)0xec, (byte)0xed, (byte)0xd4,
        (byte)0x19, (byte)0xdb, (byte)0x06, (byte)0xc1,
    };

    static final byte sha256_in_a[] = {
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
        0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
    };

    static final byte sha256_ans1000000[] = {
        (byte)0xcd, (byte)0xc7, (byte)0x6e, (byte)0x5c,
        (byte)0x99, (byte)0x14, (byte)0xfb, (byte)0x92,
        (byte)0x81, (byte)0xa1, (byte)0xc7, (byte)0xe2,
        (byte)0x84, (byte)0xd7, (byte)0x3e, (byte)0x67,
        (byte)0xf1, (byte)0x80, (byte)0x9a, (byte)0x48,
        (byte)0xa4, (byte)0x97, (byte)0x20, (byte)0x0e,
        (byte)0x04, (byte)0x6d, (byte)0x39, (byte)0xcc,
        (byte)0xc7, (byte)0x11, (byte)0x2c, (byte)0xd0,
    };
}
